import http from 'wechat-http'

// 注意这个地址要配置到小程序的后台的合法域名列表中
http.baseURL = 'https://live-api.itheima.net'

/* http.intercept.request = (options) => {
  const app = getApp()
  options.header = {
    Authorization: app.token
  }
  return options
} */

http.intercept.request = (options) => {
  // 指定默认的头信息
  const defaultHeader = {}
  // 权限认证
  const token = getApp().token
  if (token) defaultHeader.Authorization = token
  // 合并头信息
  options.header = Object.assign({}, defaultHeader, options.header)
  // 拦截器处理后的请求参数
  return options
}

// 响应拦截器
http.intercept.response = async ({
  statusCode,
  data,
  config
}) => {
  if (statusCode === 401) {
    if (config.url.includes('refreshToken')) {
      // 说明这一次 401 是由于刷新 token 时造成的 401（说白了就是 refreshToken 也过期了），直接拦截到登录页

      const currentPages = getCurrentPages()
      const currentPage = currentPages[currentPages.length - 1]
      return wx.redirectTo({
        url: `/pages/login/index?redirectURL=/${currentPage.route}`,
      })
    }

    const app = getApp()
    if (!app.refreshToken) return
    // 说明 token 过期了，用 refreshToken 向后端换取新 token
    // 如果要传递头信息，调用 http 需要用下面写法
    const res = await http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        Authorization: app.refreshToken
      }
    })
    app.setToken(res.data.token, res.data.refreshToken)
    // 获取到新的 token 和 refreshToken，要调用 app.setToken 设置一下
    // 还希望把上次 401 的请求再发一次（携带的是新 token）

    return http(Object.assign({}, config, {
      // 传递新的 token
      header: {
        Authorization: 'Bearer ' + res.data.token,
      },
    }))
  }
  // 这儿 return 啥，真正发请求的地方拿到的就是啥
  return data
}

wx.http = http

export default http